package hoe;

import java.io.IOException;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * Felhasználó kezelő.
 *
 * @author imruf84
 */
public class UserManager {

    /**
     * Felhasználók tárolója session azonosító alapján.
     */
    private static final HashMap<String, User> USERS_BY_SESSION_ID = new HashMap<>();

    /**
     * Felhasználó hitelességének a vizsgálata.
     *
     * @param request kérelem
     * @return hiteles felhasználó esetén igaz, egyébként hamis
     */
    public static boolean userIsValid(final HttpServletRequest request) {
        User user = getUserBySessionId(request.getSession().getId());
        if (null == user) {
            return false;
        }

        return user.isValid(request);
    }

    /**
     * Felhasználó lekérdezése session azonosító alapján.
     *
     * @param sessionId session azonosító
     * @return felhasználó
     */
    public static User getUserBySessionId(final String sessionId) {
        return USERS_BY_SESSION_ID.get(sessionId);
    }

    /**
     * Felhasználó lekérdezése sessionből.
     *
     * @param request kérelem
     * @return felhasználó
     */
    public static User getUserBySession(final HttpServletRequest request) {
        return getUserBySessionId(request.getSession().getId());
    }

    /**
     * Felhasználó lekérdezése név alapján.
     *
     * @param name név
     * @return névhez tartozó felhasználó vagy null, ha nem léétezk ilyen
     */
    public static User getUserByName(final String name) {
        synchronized (USERS_BY_SESSION_ID) {
            for (User u : USERS_BY_SESSION_ID.values()) {
                if (u.getUserName().equals(name)) {
                    return u;
                }
            }
        }

        return null;
    }

    /**
     * Felhasználó tárolása.
     *
     * @param user felhasználó
     */
    public static void storeUser(final User user) {
    }

    /**
     * Új felhasználó beléptetése.
     *
     * @param request kérelem
     * @param user felhasználó
     * @return beléptetett felhasználó
     */
    public static User loginUser(final HttpServletRequest request, final User user) {

        HttpSession session = request.getSession();

        // Felhasználó tárolása.
        synchronized (USERS_BY_SESSION_ID) {
            USERS_BY_SESSION_ID.put(session.getId(), user);
        }
        session.setAttribute(User.USER_NAME_SESSION_KEY, user.getUserName());
        storeUser(user);

        return user;
    }

    /**
     * Felhasználó kiléptetése.
     *
     * @param request kérelem
     * @throws java.io.IOException kivétel
     */
    public static void logoutUser(final HttpServletRequest request) throws IOException {
        HttpSession session = request.getSession();

        synchronized (USERS_BY_SESSION_ID) {
            if (USERS_BY_SESSION_ID.containsKey(session.getId())) {
                // Long polling miatt minden függőben lévő szálat le kell futtatni.
                USERS_BY_SESSION_ID.get(session.getId()).storeAsyncContext(null, null);

                USERS_BY_SESSION_ID.remove(session.getId());
            }
        }

        session.invalidate();
    }

    /**
     * Üzenet küldése minden felhasználónak.
     *
     * @param msg üzenet
     * @throws java.io.IOException kivétel
     */
    public static void sendMessageToAll(final String msg) throws IOException {
        synchronized (USERS_BY_SESSION_ID) {
            for (User u : USERS_BY_SESSION_ID.values()) {
                u.sendMessage(msg);
            }
        }
    }

}
